package com.ozdev.utils;

import java.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;


public class DateUtilities {
	
	public static String getTimeForLog() {
		String time = (new Timestamp(java.lang.System.currentTimeMillis())).toString();
		if (time.length() == 21) 
			return "[" + time + "00] ";
		else if (time.length() == 22) 
			return "[" + time + "0] ";
		else			
			return "[" + time + "] ";
		
	}		
	
	public static String getTimeForFileName() {
		String time = (new Timestamp(java.lang.System.currentTimeMillis())).toString();	
		time = time.replace(" ", "").replace("-", "").replace(":", "");
		time = time.substring(0, time.lastIndexOf('.'));
		return time.replace(" ", "").replace("-", "").replace(":", "");
		
	}
	
	/**
	 * Metodo que retorna los milisegundos hasta la fecha. Calculados segun el servidor donde esta correindo la aplicación.
	 * @return long con los milisegundos hasta la fecha.
	 */
	public static long getTime() {
		return java.lang.System.currentTimeMillis();
	}
	
	/**
	 * Metodo que retorna un objeto Timestamp con la fecha de ahora.
	 * @return Timestamp
	 */
	public static Timestamp now(){
		return new Timestamp(java.lang.System.currentTimeMillis());
	}
	

	/**
	 * Sumarle dias a una fecha determinada
     * @param fch La fecha para sumarle los dias
     * @param dias Numero de dias a agregar
     * @return La fecha agregando los dias
	 */
    public static java.sql.Date sumarFechasDias(Date fch, int dias) {
        Calendar cal = new GregorianCalendar();
        cal.setTimeInMillis(fch.getTime());
        cal.add(Calendar.DATE, dias);
        return new java.sql.Date(cal.getTimeInMillis());
    }
    
    public static java.sql.Date sumarFechasAnios(Date fch, int anios) {
        Calendar cal = new GregorianCalendar();
        cal.setTimeInMillis(fch.getTime());
        cal.add(Calendar.YEAR, anios);
        return new java.sql.Date(cal.getTimeInMillis());
    }
    
    public static java.sql.Date sumarDiasAHoy(int dias) {
        return sumarFechasDias(now(), dias);
    }
    
    public static java.sql.Date sumarAniosAHoy(int anios) {
        return sumarFechasAnios(now(), anios);
    }	
		
	public static String getDate(Date date, String format){
		
		try {
			SimpleDateFormat dateFormat = new SimpleDateFormat(format);			
			return dateFormat.format(date);
		} catch (NullPointerException e) {
//			Log.error("El patron dado es nulo");
			return "";
		} catch (IllegalArgumentException e) {
//			Log.error("El patron dado no es valido");
			return "";
		}		
	}
	
	public static String getString(java.sql.Date sqlDate, String format){
		
		try {
			SimpleDateFormat dateFormat = new SimpleDateFormat(format);			
			return dateFormat.format(sqlDate);
		} catch (NullPointerException e) {
//			Log.error("El patron dado es nulo");
			return "";
		} catch (IllegalArgumentException e) {
//			Log.error("El patron dado no es valido");
			return "";
		}		
	}
	
	public static String getString(java.sql.Timestamp sqlTimestamp, String format){
		
		try {
			SimpleDateFormat dateFormat = new SimpleDateFormat(format);			
			return dateFormat.format(sqlTimestamp);
		} catch (NullPointerException e) {
//			Log.error("El patron dado es nulo");
			return "";
		} catch (IllegalArgumentException e) {
//			Log.error("El patron dado no es valido");
			return "";
		}		
	}
	
	public static String getDate(Date date){				
		return getDate(date, "dd-MM-yyyy HH:mm:ss");	
	}
	
	/**
	 * Recibe un objeto java.sql.Date y lo convierte a un String con formato yyyy-MM-dd.
	 * @param java.sql.Date sqlDate
	 * @return String con formato dd-MM-yyyy
	 */
	public static String getString(java.sql.Date sqlDate){				
		return getString(sqlDate, "dd-MM-yyyy");	
	}	
	
	/**
	 * Recibe un objeto java.sql.Date y lo convierte a un String con formato yyyy-MM-dd.
	 * @param java.sql.Date sqlDate
	 * @return String con formato HH:mm:ss
	 */
	public static String getString(java.sql.Time sqlDate){				
		return getDate(sqlDate, "HH:mm:ss");	
	}
	
	public static String getString(java.sql.Timestamp sqlTimestamp){				
		return getString(sqlTimestamp, "dd-MM-yyyy");	
	}
	
	public static boolean isDate(String strDate, String format) {
		SimpleDateFormat dateFormat = new SimpleDateFormat(format);
		try {
			dateFormat.parse(strDate);
			return true;
		} catch (Exception e) {
			return false;
		}
	}

	public static boolean isDate(String strDate) {
		return isDate(strDate, "dd-MM-yyyy");
	}
	
	public static java.sql.Date getSqlDate(String strDate, String format) throws ParseException {
		SimpleDateFormat dateFormat = new SimpleDateFormat(format);
		return new java.sql.Date(dateFormat.parse(strDate).getTime());
	}
	
	/**
	 * El formato de la fecha de ingreso debe ser de la siguiente manera: "dd-MM-yyyy" 
	 * @param strDate
	 * @return
	 * @throws ParseException
	 */
	public static java.sql.Date getSqlDate(String strDate) throws ParseException {
		return getSqlDate(strDate, "dd-MM-yyyy");
	}
	
}
